/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKSede;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */

@Named(value = "MBCompBuscarDireccion")
@Scope("request")
public class MBCompBuscarDireccion extends MBGenerico implements ISubject,Serializable{
    
    @Inject
    private IServicioSede servicioSede;
    @Inject
    private BKSede bkSede;
    @Inject
    private IServicioProveedor servicioProveedor;
    @Inject
    private IServicioCliente servicioCliente;
    @Inject
    private IServicioEmpresa servicioEmpresa;
    @Autowired
    BKSession session;
    
    private static Logger logger = Logger.getLogger(MBCompBuscarDireccion.class);
    
    
    public void inicializarBusquedaDireccion(ActionEvent actionEvent) {
        bkSede.setTipoOrganizacion(null);
        bkSede.setListaOrganizacionBusqueda(null);
        bkSede.setListaDireccionBusqueda(null);
        bkSede.setIdOrganizacionBusqueda(0);
        bkSede.setIdDireccionBusqueda(0);

        System.out.println("es RS= "+bkSede.isConRazonSocial());
    }

    public void buscarOrganizaciones() {
        bkSede.setListaOrganizacionBusqueda(null);
        try {
            if (bkSede.getTipoOrganizacion() == 'p') {
                bkSede.setListaOrganizacionBusqueda(SelectOneMenuHelper.listaProveedor((List<Proveedor>) servicioProveedor.listarProveedorActivos()));
            } else if (bkSede.getTipoOrganizacion() == 'c') {
                bkSede.setListaOrganizacionBusqueda(SelectOneMenuHelper.listaClientes((List<Cliente>) servicioCliente.listarClientesActivos()));
            } else if (bkSede.getTipoOrganizacion() == 'e') {
                List<Empresa> listaEmpresa = new ArrayList<Empresa>();
                listaEmpresa.add(session.getEmpresa());
                bkSede.setListaOrganizacionBusqueda(SelectOneMenuHelper.listaEmpresas(listaEmpresa));
            }
            bkSede.setListaDireccionBusqueda(null);
            bkSede.setIdOrganizacionBusqueda(-1);
            bkSede.setIdDireccionBusqueda(0);

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarLocales() {
        Sede sede = new Sede();
        try {
            if (bkSede.getTipoOrganizacion() == 'p') {
                sede.setIdProveedor(servicioProveedor.conseguirProveedorPorId(bkSede.getIdOrganizacionBusqueda()));
            } else if (bkSede.getTipoOrganizacion() == 'c') {
                sede.setIdCliente(servicioCliente.conseguirClientePorId(bkSede.getIdOrganizacionBusqueda()));
            } else if (bkSede.getTipoOrganizacion() == 'e') {
                sede.setIdEmpresa(servicioEmpresa.conseguirEmpresaPorId(bkSede.getIdOrganizacionBusqueda()));
            }

            bkSede.setListaDireccionBusqueda(servicioSede.listaSedeAlmacenPorOrganizacion(sede));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void aplicarDireccion() {
        bkSede.setConRazonSocial(false);
        notificarObservadores();
    }

    @Override
    public void addObserver(IObserver observador) {
        bkSede.addObservers(observador);
    }

    @Override
    public void notificarObservadores() {
        try {
            Sede sede = servicioSede.conseguirSedePorId(bkSede.getIdDireccionBusqueda());

            Map<String, Object> datos = new HashMap<String, Object>();
            datos.put("sede", sede);
            for (IObserver iObserver : bkSede.getObservers()) {
                iObserver.actualizarObservador(datos);
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
    
}
